﻿using System.Collections.Generic;
using System.Linq;

namespace Insesoft.Entities
{
    public class Usuario: EntidadCatalogo
    {
        #region Private Members
        
        private Empresa empresa;
        private string nombreUsuario;
        private string clave;
        private bool cotizar;
        private bool borrar;
        private bool crear;
        private IList<Permiso> permisos;

        private static Usuario emptyInstance;

        #endregion
        
        #region Public Properties

        public static Usuario EmptyInstance
        {
            get { return emptyInstance ?? (emptyInstance = new Usuario()); }
        }

        public virtual Empresa Empresa
        {
            get { return empresa; }
            set { isChanged |= (empresa != value); empresa = value; }
        }

        public virtual string NombreUsuario
        {
            get { return nombreUsuario; }
            set
            {
                CheckLength("NombreUsuario", value, 30);
                isChanged |= (nombreUsuario != value); nombreUsuario = value;
            }
        }

        public virtual string Clave
        {
            get { return clave; }
            set
            {
                CheckLength("Clave", value, 30);
                isChanged |= (clave != value); clave = value;
            }
        }

        public virtual bool Cotizar
        {
            get { return cotizar; }
            set { isChanged |= (cotizar != value); cotizar = value; }
        }

        public virtual bool Borrar
        {
            get { return borrar; }
            set { isChanged |= (borrar != value); borrar = value; }
        }

        public virtual bool Crear
        {
            get { return crear; }
            set { isChanged |= (crear != value); crear = value; }
        }

        public virtual IList<Permiso> Permisos
        {
            get { return permisos; }
            set { isChanged |= (permisos != value); permisos = value; }
        }
        
        #endregion
        
        public override bool Equals(object obj)
        {
            if (obj == null || GetType() != obj.GetType()) return false;
            var castObj = (Usuario)obj;
            return Empresa == castObj.Empresa && NombreUsuario == castObj.NombreUsuario;
        }

        public override int GetHashCode()
        {
            var hash = 57;
            hash = 27 * hash * Empresa.GetHashCode() * NombreUsuario.GetHashCode();
            return hash;
        }

        public virtual bool TienePermiso(int id)
        {
            return Permisos.Where(p => p.Id == id).Any();
        }
    }
}
